#ifndef MANGOS_BAG_H
#define MANGOS_BAG_H

#include "Common.h"
#include "ItemPrototype.h"
#include "Item.h"

// Maximum 36 Slots ( (CONTAINER_END - CONTAINER_FIELD_SLOT_1)/2
#define MAX_BAG_SIZE 36                                     // 2.0.12

class Bag : public Item
{
public:/// virtuals
	// DB operations
	// overwrite virtual Item::SaveToDB
	void					SaveToDB();
	// overwrite virtual Item::LoadFromDB
	bool					LoadFromDB(uint32 guidLow, Field *fields, ObjectGuid ownerGuid = ObjectGuid());
	// overwrite virtual Item::DeleteFromDB
	void					DeleteFromDB();


public:/// c&d
							Bag();
							~Bag();

public:///
    void					AddToWorld();
    void					RemoveFromWorld();

    bool					Create(uint32 guidlow, uint32 itemid, Player const* owner);

	bool					IsEmpty() const;
	uint32					GetBagSize() const { return GetUInt32Value(CONTAINER_FIELD_NUM_SLOTS); }

	/// items
    void					Clear();
    void					StoreItem( uint8 slot, Item *pItem, bool update );
    void					RemoveItem( uint8 slot, bool update );
    Item*					GetItemByPos( uint8 slot ) const;
    Item*					GetItemByEntry( uint32 item ) const;
    Item*					GetItemByLimitedCategory(uint32 limitedCategory) const;
    uint32					GetItemCount(uint32 item, Item* eItem = NULL) const;
    uint32					GetItemCountWithLimitCategory(uint32 limitCategory, Item* eItem = NULL) const;

	/// slot
    uint8					GetSlotByItemGUID(uint64 guid) const;
    uint32					GetFreeSlots() const;

    void					BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) const;

protected:
    // Bag Storage space
    Item*					m_bagslot[MAX_BAG_SIZE];
};

inline Item*				NewItemOrBag(ItemPrototype const * proto)
{
	if (proto->InventoryType == INVTYPE_BAG)
		return new Bag;

	return new Item;
}

#endif
